﻿#ifndef PLUGINLOADER_H
#define PLUGINLOADER_H

#include "PluginInterface.h"
#include <QObject>
#include <QPluginLoader>
#include <QVariant>
#include<QQueue>


/*
 * 仅允许在程序启动时，创建PluginLoader。
 * 插件里只能引用loader，由在初始化plugin时，传入。
*/
class PLUGINCORE_EXPORT  PluginLoader : public QObject
{
    Q_OBJECT
public:
    ~PluginLoader();
    PluginLoader();

    QWidget *mainWindow=0;
    QHash<QString, PluginInfo*> mcheckedPluginInfoMap; //插件名称--PluginInfo
    QHash<QString, PluginInfo*> mLoadedPluginInfoMap;//加载失败的插件信息
    QHash<QString,QString>mPluginFiles;

    void connectAll();
    void disconnectAll();
    void connectPlugin(PluginInterface *plugin);
    void disconnectPlugin(PluginInterface *plugin);
    //加载所有插件
    void loadAllPlugins();
    //插件检查
    bool checkAll();
    void check(PluginInfo *info);

    PluginInfo *loadPluginByFileName(const QString &fileName);
    //加载插件
    PluginInfo *loadPlugin(const QString &filePath);
    //卸载所有插件
    void unloadAllPlugins();
    //卸载某个插件
    void unloadPlugin(const QString &name);

    inline PluginInfo* getPluginInfo(const QString &pluginName){return mcheckedPluginInfoMap.value(pluginName); }
    //获取某个插件
    inline PluginInterface* getPlugin(const QString &pluginName){auto info=mcheckedPluginInfoMap.value(pluginName); return info?info->plugin:NULL;}
    //获取所有插件名称
    QList<QVariant> allPluginsName();
    //获取某个插件名称
    QVariant getPluginName(QPluginLoader *loader);
    QVariant getName(const QString &pluginFile);


signals:
    int sig_msg(int type,void* userdata=0);
    int sig_plugin(QVariant arg_in, QVariant &arg_out);
public slots:
    int slot_msg(int type,void*userdata=0);
    int slot_plugin(QVariant arg_in, QVariant &arg_out) { Q_UNUSED(arg_in);Q_UNUSED(arg_out);return 0; }

};

#endif
